\documentclass{ctexart}

\usepackage{graphicx}
%\DeclareGraphicsExtension{.bmp}
\usepackage{amsmath}
\usepackage{listings}
\usepackage{tikz}
%\usetikzlibrary{chains}


\title{Mandelbrot set的生成与探索\cite{P1987H}\cite{1988The}\cite{2006Evolutionary}}


\author{张凌帆 ZhangLingfan \\ 数学与应用数学 3190104913}

\begin{document}

\maketitle
摘要：本文主要是对mandelbrot集合进行了探索。首先，我们给除了mandelbrot集合的定义和相应的数学理论，然后我们根据相应的理论给出算法以及用代码实现算法之后画出的图像。接下来，我们对这个图像进行了全方位的探索，比如改变其精度观察图像的变化，生成局部图观察其局部的微观结构等等，当然，也可以根据自己的喜好对图像的颜色加以变化。生成的图像既具有数学的条理，也具有艺术的美感，让人感受到数学的无限魅力。

\section{问题的背景介绍}
\subsection{Mandelbrot集的介绍}
Mandelbrot集，表示为M，是复数c的集合，M中的复数点c满足：使得多项式$P（z）=z^2+c$的临界点z=0有一个不会趋向于无限（即有界）的轨道。

这有两个重要原因：

1.P的Julia集是连通的当且仅当$c\to M$

2.动力系统$z\to P(z)$在$P$的扰动下是稳定的当且仅当$c\in \delta M$、 这里$\delta $是拓扑边界的符号。
\subsection{Mandelbrot的生成与探索}
在本篇文章里，我们主要在复平面上找出Mandelbrot集合中的点，并且尝试在bmp图像中将它标出。然后，



\section{数学理论}
{\bf 定理：} 0的轨道趋向于无穷，当且进当在某些点它的模大于等于2.

这个定理可以帮助我们写出下面的算法。下面的算法即是用在一定步数内迭代其模是否大于2来作为判断是否在Mandelbrot集合中的标准。


\section{算法}
下面是一段伪代码：

\begin{lstlisting}[language = Matlab,title={Algorithm},  numbers=left, 
    numberstyle=\tiny,keywordstyle=\color{blue!70},
    commentstyle=\color{red!50!green!50!blue!50},frame=shadowbox,
    rulesepcolor=\color{red!20!green!20!blue!20},basicstyle=\ttfamily]
  for p in allpixels:
  # replace here by your own loop or pair of loops 
  # to scan all pixels
      c = p.affix 
      # here you may replace by 
      # your code computing c (complex nb)
      z = 0j
      color = black 
      # 'color' will be assigned to p at the end, 
      #  black is a temporary value
      for n in range(0,N):
          if squared_modulus(z)>4: 
          color = white
          break 
          # this will break the innermost for loop 
          # and jump just after (two lines below)
      z = z*z+c
      p.color = color

  
\end{lstlisting}

下面给出一段C++风格的算法，这样更有利于我们用C++实现这个算法：

\begin{lstlisting}[language = Matlab,title={Algorithm-C++-type},  numbers=left, 
    numberstyle=\tiny,keywordstyle=\color{blue!70},
    commentstyle=\color{red!50!green!50!blue!50},frame=shadowbox,
    rulesepcolor=\color{red!20!green!20!blue!20},basicstyle=\ttfamily]
  for(int i=0; i<height; i++) {
  for(int j=0; j<width; j++) {
    complex c = some formula of i and j;
    complex z = 0.;
    for(int n=0; n<N; n++) {
      if(squared_modulus(z)>4) {
        image[i][j]=black;
        goto label;
      }
      z = z*z+c;
    }
    image[i][j]=white;
    label: {}
  }
}
\end{lstlisting}


\section{数值算例}


我们这里用C++实现了上述算法，并且用不同的精度话除了Mandelbrot图像，下面展示不同的精度下的图像：
%\DeclareGraphicsExtension{.bmp}
\begin{figure}[htbp]
\centering
\includegraphics[width=7cm,height=2cm]{test.bmp}
\caption{N=20}
\label{N100}
\end{figure}


\begin{figure}[htbp]
\centering
\includegraphics[width=7cm,height=2cm]{test20.bmp}
\caption{N=100}
\label{N100}
\end{figure}

下面展示一下不同精度的局部图：

（由于技术原因，图片可能出现在下一页）

\begin{figure}[htbp]
\centering
\includegraphics[width=4cm,height=1.5cm]{test20_1.bmp}
\caption{N=20}
\label{N100}
\end{figure}

\begin{figure}[htbp]
\centering
\includegraphics[width=4cm,height=1.5cm]{test1.bmp}
\caption{N=100}
\label{N100}
\end{figure}




\section{结论}
可以看出，上述mandelbrot集合图像在N越大时精度越高，边缘越粗糙，越接近于离散的状态。而且可以看到局部的结构是一个无限迭代的结构。
\bibliographystyle{plain}
\bibliography{a.bib}

\end{document}


